/******************************************************************************* * Copyright (c) 2008 - 2014 Red Hat, Inc. and others. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Xavier Coulon - Initial API and implementation ******************************************************************************/ package org.jboss.tools.ws.jaxrs.ui.quickfix; import static org.hamcrest.Matchers.equalTo; import static org.jboss.tools.ws.jaxrs.core.junitrules.ResourcesUtils.replaceFirstOccurrenceOfCode; import static org.jboss.tools.ws.jaxrs.ui.internal.validation.ValidationUtils.findJavaProblems; import static org.jboss.tools.ws.jaxrs.ui.internal.validation.ValidationUtils.findJaxrsMarkers; import static org.jboss.tools.ws.jaxrs.ui.internal.validation.ValidationUtils.havePreferenceKey; import static org.jboss.tools.ws.jaxrs.ui.internal.validation.ValidationUtils.toSet; import static org.jboss.tools.ws.jaxrs.ui.preferences.JaxrsPreferences.HTTP_METHOD_MISSING_TARGET_ANNOTATION; import static org.jboss.tools.ws.jaxrs.ui.preferences.JaxrsPreferences.NAME_BINDING_MISSING_TARGET_ANNOTATION; import static org.junit.Assert.assertThat; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.wst.validation.ReporterHelper; import org.eclipse.wst.validation.internal.core.ValidationException; import org.eclipse.wst.validation.internal.provisional.core.IReporter; import org.jboss.tools.common.validation.ContextValidationHelper; import org.jboss.tools.common.validation.IProjectValidationContext; import org.jboss.tools.common.validation.ValidatorManager; import org.jboss.tools.common.validation.internal.ProjectValidationContext; import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsHttpMethod; import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsMetamodel; import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsNameBinding; import org.jboss.tools.ws.jaxrs.core.junitrules.JaxrsMetamodelMonitor; import org.jboss.tools.ws.jaxrs.core.junitrules.WorkspaceSetupRule; import org.jboss.tools.ws.jaxrs.core.metamodel.domain.EnumElementCategory; import org.jboss.tools.ws.jaxrs.ui.internal.validation.JaxrsMetamodelValidator; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; /** * @author xcoulon * */ @SuppressWarnings("restriction") public class TargetAnnotationMarkerResolutionTestCase { private final IReporter reporter = new ReporterHelper(new NullProgressMonitor()); private final ContextValidationHelper validationHelper = new ContextValidationHelper(); private final IProjectValidationContext context = new ProjectValidationContext(); private final ValidatorManager validatorManager = new ValidatorManager(); @ClassRule public static WorkspaceSetupRule workspaceSetupRule = new WorkspaceSetupRule("org.jboss.tools.ws.jaxrs.tests.sampleproject2"); @Rule public JaxrsMetamodelMonitor metamodelMonitor = new JaxrsMetamodelMonitor("org.jboss.tools.ws.jaxrs.tests.sampleproject2", false); private JaxrsMetamodel metamodel = null; private IProject project = null; private IJavaProject javaProject = null; @Before public void setup() throws CoreException { this.metamodel = metamodelMonitor.getMetamodel(); this.project = metamodel.getProject(); this.javaProject = metamodel.getJavaProject(); } @Test public void shouldAddTargetAnnotationAndAllImportsOnHttpMethod() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("BAZ.txt", "org.jboss.tools.ws.jaxrs.sample.services", "BAZ.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "import java.lang.annotation.Target;", "//import java.lang.annotation.Target;", false); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "import java.lang.annotation.ElementType;", "//import java.lang.annotation.ElementType;", false); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "@Target(value=ElementType.METHOD)", "//@Target(value=ElementType.METHOD)", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.BAZ"); final JaxrsHttpMethod bazMethod = (JaxrsHttpMethod) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.BAZ", EnumElementCategory.HTTP_METHOD); // operation 1: validate the HTTP Method new JaxrsMetamodelValidator().validate(toSet(bazMethod.getResource()), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation final IMarker[] markers = findJaxrsMarkers(bazMethod); assertThat(markers.length, equalTo(1)); assertThat(markers, havePreferenceKey(HTTP_METHOD_MISSING_TARGET_ANNOTATION)); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = bazMethod.getJavaElement().getCompilationUnit(); JavaCompletionProposalUtils.applyMarkerResolution(new AddHttpMethodTargetAnnotationMarkerResolution(bazMethod.getJavaElement()), bazMethod.getResource()); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(bazMethod.getResource()), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(bazMethod).length, equalTo(0)); assertThat(findJavaProblems(bazMethod.getResource()).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationWhenImportsExistOnHttpMethod() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("BAZ.txt", "org.jboss.tools.ws.jaxrs.sample.services", "BAZ.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "@Target(value=ElementType.METHOD)", "//@Target(value=ElementType.METHOD)", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.BAZ"); final JaxrsHttpMethod bazMethod = (JaxrsHttpMethod) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.BAZ", EnumElementCategory.HTTP_METHOD); // operation 1: validate the HTTP Method new JaxrsMetamodelValidator().validate(toSet(bazMethod.getResource()), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation final IMarker[] markers = findJaxrsMarkers(bazMethod); assertThat(markers.length, equalTo(1)); assertThat(markers, havePreferenceKey(HTTP_METHOD_MISSING_TARGET_ANNOTATION)); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = bazMethod.getJavaElement().getCompilationUnit(); JavaCompletionProposalUtils.applyMarkerResolution(new AddHttpMethodTargetAnnotationMarkerResolution(bazMethod.getJavaElement()), bazMethod.getResource()); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(bazMethod.getResource()), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(bazMethod).length, equalTo(0)); assertThat(findJavaProblems(bazMethod.getResource()).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationValueAndImportOnHttpMethod() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("BAZ.txt", "org.jboss.tools.ws.jaxrs.sample.services", "BAZ.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "import java.lang.annotation.ElementType;", "//import java.lang.annotation.ElementType;", false); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "@Target(value=ElementType.METHOD)", "@Target()", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.BAZ"); final JaxrsHttpMethod bazMethod = (JaxrsHttpMethod) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.BAZ", EnumElementCategory.HTTP_METHOD); // operation 1: validate the HTTP Method final IResource resource = bazMethod.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation value final IMarker[] markers = findJaxrsMarkers(bazMethod); assertThat(markers.length, equalTo(0)); final IProblem[] javaProblems = findJavaProblems(resource); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = bazMethod.getJavaElement().getCompilationUnit(); final IJavaCompletionProposal completionProposal = new AddHttpMethodTargetValuesCompletionProposal(compilationUnit, JaxrsMarkerResolutionGenerator.findEffectiveSourceRange(compilationUnit, new ProblemLocation(javaProblems[0]))); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, bazMethod); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(bazMethod).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationValueOnlyWhenImportsExistOnHttpMethod() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("BAZ.txt", "org.jboss.tools.ws.jaxrs.sample.services", "BAZ.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "@Target(value=ElementType.METHOD)", "@Target", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.BAZ"); final JaxrsHttpMethod bazMethod = (JaxrsHttpMethod) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.BAZ", EnumElementCategory.HTTP_METHOD); // operation 1: validate the HTTP Method final IResource resource = bazMethod.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation value final IMarker[] markers = findJaxrsMarkers(bazMethod); assertThat(markers.length, equalTo(0)); final IProblem[] javaProblems = findJavaProblems(resource); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = bazMethod.getJavaElement().getCompilationUnit(); final IJavaCompletionProposal completionProposal = new AddHttpMethodTargetValuesCompletionProposal(compilationUnit, JaxrsMarkerResolutionGenerator.findEffectiveSourceRange(compilationUnit, new ProblemLocation(javaProblems[0]))); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, bazMethod); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(bazMethod).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldUpdateRetentionAnnotationValueWhenInvalidValueOnHttpMethod() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("BAZ.txt", "org.jboss.tools.ws.jaxrs.sample.services", "BAZ.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.BAZ", javaProject, "@Target(value=ElementType.METHOD)", "@Target(value=ElementType.TYPE)", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.BAZ"); final JaxrsHttpMethod bazMethod = (JaxrsHttpMethod) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.BAZ", EnumElementCategory.HTTP_METHOD); // operation 1: validate the HTTP Method final IResource resource = bazMethod.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Retention annotation value assertThat(findJavaProblems(resource).length, equalTo(0)); final IMarker[] markers = findJaxrsMarkers(bazMethod); assertThat(markers.length, equalTo(1)); // operation 2: now, use the quickfix to fix the problem final IJavaCompletionProposal completionProposal = new UpdateHttpMethodTargetAnnotationValueMarkerResolution(bazMethod.getJavaElement()); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, bazMethod); metamodelMonitor.processEvent(bazMethod.getJavaElement().getCompilationUnit(), IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(bazMethod).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationAndAllImportsOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "import java.lang.annotation.Target;", "//import java.lang.annotation.Target;", false); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "import java.lang.annotation.ElementType;", "//import java.lang.annotation.ElementType;", false); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "//@Target({ ElementType.TYPE, ElementType.METHOD })", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding new JaxrsMetamodelValidator().validate(toSet(nameBinding.getResource()), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(1)); assertThat(markers, havePreferenceKey(NAME_BINDING_MISSING_TARGET_ANNOTATION)); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = nameBinding.getJavaElement().getCompilationUnit(); JavaCompletionProposalUtils.applyMarkerResolution(new AddNameBindingTargetAnnotationMarkerResolution(nameBinding.getJavaElement()), nameBinding.getResource()); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(nameBinding.getResource()), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(nameBinding.getResource()).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationWhenImportsExistOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "//@Target({ ElementType.TYPE, ElementType.METHOD })", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding new JaxrsMetamodelValidator().validate(toSet(nameBinding.getResource()), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(1)); assertThat(markers, havePreferenceKey(NAME_BINDING_MISSING_TARGET_ANNOTATION)); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = nameBinding.getJavaElement().getCompilationUnit(); JavaCompletionProposalUtils.applyMarkerResolution(new AddNameBindingTargetAnnotationMarkerResolution(nameBinding.getJavaElement()), nameBinding.getResource()); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(nameBinding.getResource()), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(nameBinding.getResource()).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationValueAndImportOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "import java.lang.annotation.ElementType;", "//import java.lang.annotation.ElementType;", false); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "@Target()", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding final IResource resource = nameBinding.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation value final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(0)); final IProblem[] javaProblems = findJavaProblems(resource); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = nameBinding.getJavaElement().getCompilationUnit(); final IJavaCompletionProposal completionProposal = new AddNameBindingTargetValuesCompletionProposal(compilationUnit, JaxrsMarkerResolutionGenerator.findEffectiveSourceRange(compilationUnit, new ProblemLocation(javaProblems[0]))); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, nameBinding); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldAddTargetAnnotationValueOnlyWhenImportsExistOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "@Target", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding final IResource resource = nameBinding.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Target annotation value final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(0)); final IProblem[] javaProblems = findJavaProblems(resource); // operation 2: now, use the quickfix to fix the problem final ICompilationUnit compilationUnit = nameBinding.getJavaElement().getCompilationUnit(); final IJavaCompletionProposal completionProposal = new AddNameBindingTargetValuesCompletionProposal(compilationUnit, JaxrsMarkerResolutionGenerator.findEffectiveSourceRange(compilationUnit, new ProblemLocation(javaProblems[0]))); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, nameBinding); metamodelMonitor.processEvent(compilationUnit, IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldUpdateRetentionAnnotationValueWhenMissingValueOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "@Target(value=ElementType.TYPE)", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding final IResource resource = nameBinding.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Retention annotation value assertThat(findJavaProblems(resource).length, equalTo(0)); final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(1)); // operation 2: now, use the quickfix to fix the problem final IJavaCompletionProposal completionProposal = new UpdateNameBindingTargetAnnotationValueMarkerResolution(nameBinding.getJavaElement()); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, nameBinding); metamodelMonitor.processEvent(nameBinding.getJavaElement().getCompilationUnit(), IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldUpdateRetentionAnnotationValueWhenInvalidValueOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "@Target(value=ElementType.FIELD)", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding final IResource resource = nameBinding.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Retention annotation value assertThat(findJavaProblems(resource).length, equalTo(0)); final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(1)); // operation 2: now, use the quickfix to fix the problem final IJavaCompletionProposal completionProposal = new UpdateNameBindingTargetAnnotationValueMarkerResolution(nameBinding.getJavaElement()); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, nameBinding); metamodelMonitor.processEvent(nameBinding.getJavaElement().getCompilationUnit(), IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } @Test public void shouldUpdateRetentionAnnotationValueWhenInvalidAndMissingValueOnNameBinding() throws CoreException, ValidationException { // pre-conditions metamodelMonitor.createCompilationUnit("AnotherNameBinding.txt", "org.jboss.tools.ws.jaxrs.sample.services", "AnotherNameBinding.java"); replaceFirstOccurrenceOfCode("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", javaProject, "@Target({ ElementType.TYPE, ElementType.METHOD })", "@Target(value={ElementType.TYPE, ElementType.FIELD})", false); metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding"); final JaxrsNameBinding nameBinding = (JaxrsNameBinding) metamodel.findElement("org.jboss.tools.ws.jaxrs.sample.services.AnotherNameBinding", EnumElementCategory.NAME_BINDING); // operation 1: validate the Name Binding final IResource resource = nameBinding.getResource(); new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); // verification 1: there should be 1 error: missing @Retention annotation value assertThat(findJavaProblems(resource).length, equalTo(0)); final IMarker[] markers = findJaxrsMarkers(nameBinding); assertThat(markers.length, equalTo(1)); // operation 2: now, use the quickfix to fix the problem final IJavaCompletionProposal completionProposal = new UpdateNameBindingTargetAnnotationValueMarkerResolution(nameBinding.getJavaElement()); JavaCompletionProposalUtils.applyCompletionProposal(completionProposal, nameBinding); metamodelMonitor.processEvent(nameBinding.getJavaElement().getCompilationUnit(), IJavaElementDelta.CHANGED); // verification 2: revalidate, there should be 0 JAX-RS/Java error new JaxrsMetamodelValidator().validate(toSet(resource), project, validationHelper, context, validatorManager, reporter); assertThat(findJaxrsMarkers(nameBinding).length, equalTo(0)); assertThat(findJavaProblems(resource).length, equalTo(0)); } }